package cn.iocoder.yudao.module.erp.service.dp;

import javax.validation.*;

import cn.iocoder.yudao.module.erp.controller.admin.common.DpCountQuantity;
import cn.iocoder.yudao.module.erp.controller.admin.dispatchvehicle.vo.DispatchVehicleSaveReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.dp.vo.*;
import cn.iocoder.yudao.module.erp.dal.dataobject.dp.DpDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.erp.dal.dataobject.dpitem.DpItemDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.dplist.DpEastListDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.dplist.DpWestListDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.claim.ClaimDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.pay.PayDO;

import java.util.List;

/**
 * ERP总制单 Service 接口
 * @author 天使管理员
 */
public interface DpService {

    /**
     * 创建ERP总制单
     * @param createReqVO 创建信息
     * @return 编号
     */
    String createDp(@Valid DpSaveReqVO createReqVO);

    /**
     * 更新ERP总制单
     * @param updateReqVO 更新信息
     */
    void updateDp(@Valid DpSaveReqVO updateReqVO);

    /**
     * 删除ERP总制单
     * @param id 编号
     */
    void deleteDp(String id);

    /**
     * 获得ERP总制单
     * @param id 编号
     * @return ERP东宁制单
     */
    DpDO getDp(String id);

    /**
     * 获得ERP总制单分页
     * @param pageReqVO 分页查询
     * @return ERP总制单分页
     */
    PageResult<DpDO> getDpPage(DpPageReqVO pageReqVO);

    /**
     * 获得收货人数据
     * @param pageReqVO 分页查询
     * @return ERP总制单分页
     */
    PageResult<DpDO> shipperDate(DpPageReqVO pageReqVO);

    /**
     * 根据发货人获得ERP总制单分页
     * @param pageReqVO 分页查询
     * @return ERP总制单分页
     */
    PageResult<DpDO> selectByShipper(DpPageReqVO pageReqVO);

    /**
     * 根据发货人统计各金额数
     * @param shipper
     * @return
     */
    DpDO getDpFareCount(String shipper);

    /**
     * ERP总物流单据审核反审核
     * @param pageReqVO
     */
    void examineDp(DpPageReqVO pageReqVO);

    /**
     * 根据运单号回退单据至对应制单仓库
     * @param id
     */
    void dpReturn(String id);

    // ==================== 子表（总东线清单） ====================

    /**
     * 获得总东线清单列表
     * @param no 运单号
     * @return 总东线清单列表
     */
    List<DpEastListDO> getDpEastListListByNo(String no);

    // ==================== 子表（总西线清单） ====================

    /**
     * 获得总西线清单列表
     * @param no 运单号
     * @return 总西线清单列表
     */
    List<DpWestListDO> getDpWestListListByNo(String no);

    // ==================== 子表（ERP总制单货号详情） ====================

    /**
     * 获得ERP总制单货号详情列表
     * @param no 运单号
     * @return ERP总制单货号详情列表
     */
    List<DpItemDO> getDpItemListByNo(String no);

    /**
     * ERP总制单数据统计
     * @return
     */
    DpCountQuantity getDpCountQuantity();

    /**
     * ERP仓库提货
     * @param id
     */
    Integer dpPickUp(String tableName, String id, Integer pickStatus,Integer signNum,Integer signStatus);

    /**
     * 搜索发货人总制单列表
     * @param shipper 发货人
     * @return 搜索发货人总制单列表
     */
    List<DpDO> searchSipperDpList(String shipper, String no, Integer prepaidStatus);

    /**
     * ERP运费付款
     * @param payDO
     */
    void dpPay(PayDO payDO);

    /**
     * ERP运费赔付
     * @param claimDO
     */
    void dpClaim(ClaimDO claimDO);

    List<DpDO> getNoByShipper(String shipper);

    /**
     * 批量导入运单
     * @param importDpIds     导入运单列表
     * @param isUpdateSupport 是否支持更新
     * @return 导入结果
     */
    Boolean importUserList(Integer storeType,List<DpIdImportExcelVO> importDpIds, Boolean isUpdateSupport);

    /**
     * 批量导入制单
     * @param importDpIds     导入制单列表
     * @param isUpdateSupport 是否支持更新
     * @return 导入结果
     */
    Boolean importDpList(Integer storeType,Integer line,List<DpImportExcelVO> importDpIds, Boolean isUpdateSupport);

    /**
     * 出库列表导出Excel
     * @return
     */
    List<DpOutStoreRespVo> selectDpByids(Integer storeType, List<String> ids);

}